// Package valueobject 分页器值对象
package valueobject

// Pagination 分页器
type Pagination struct {
	page     uint8
	pageSize uint32
}

const (
	defaultPage     uint8  = 1
	defaultPageSize uint32 = 10
)

// NewPagination 初始化分页器
func NewPagination(page uint8, pageSize uint32) *Pagination {
	p := &Pagination{page, pageSize}

	if page == 0 {
		p.page = defaultPage
	}

	if pageSize == 0 {
		p.pageSize = defaultPageSize
	}
	return p
}

// NewDefaultPagination 初始化默认分页器
func NewDefaultPagination() *Pagination {
	return &Pagination{defaultPage, defaultPageSize}
}

// GetOffset 获取偏移值
func (p *Pagination) GetOffset() int {
	p.paginationValidate()
	return int((uint32(p.page) - 1) * p.pageSize)
}

// GetPage 获取页码值
func (p *Pagination) GetPage() int {
	p.paginationValidate()
	return int(p.page)
}

// GetPageSize 获取页大小值
func (p *Pagination) GetPageSize() int {
	p.paginationValidate()
	return int(p.pageSize)
}

// 校验数据
func (p *Pagination) paginationValidate() {
	if p.pageSize == 0 {
		p.pageSize = defaultPageSize
	}

	if p.page == 0 {
		p.page = defaultPage
	}
}
